package it.scambiocorse.dao;

import it.scambiocorse.model.CronBean;
import it.scambiocorse.model.JTableType;
import it.scambiocorse.model.ServizioJson;
import it.scambiocorse.model.ServizioType;
import it.scambiocorse.rowmapper.CronRowMapper;
import it.scambiocorse.rowmapper.ServizioRowMapper;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.lang.Number;

import it.scambiocorse.utils.Costanti;
import it.scambiocorse.utils.Utils;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sun.org.apache.bcel.internal.generic.NEW;


	public class ServizioDao extends JdbcDaoSupport implements ServizioService {
		
		final Logger logger = Logger.getLogger(getClass());
		public AreaService areaService;
		public ClienteService clienteService;
		

	  public ClienteService getClienteService() {
			return clienteService;
		}

		public void setClienteService(ClienteService clienteService) {
			this.clienteService = clienteService;
		}

	public AreaService getAreaService() {
			return areaService;
		}

		public void setAreaService(AreaService areaService) {
			this.areaService = areaService;
		}
		
		
	protected void initDao() throws Exception {
	    super.initDao();
	    getJdbcTemplate().setNativeJdbcExtractor(new SimpleNativeJdbcExtractor());

	  }
	  
	
	  
	  
		public ArrayList<ServizioType> listaServiziPartecipante(int idUser, String dataIniz, String dataFine) throws Exception {
			String metodo = "listaServiziPartecipante(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			
			  List ret = null;
			  String sql = "call listaServiziPartecipante(?,?,?)";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser+", ? = "+dataIniz+", ? = "+dataFine);
			  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] { idUser, dataIniz, dataFine}, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
			return (ArrayList<ServizioType>)ret;
		}	
	  
	  
	 
	  public ArrayList<ServizioType> listaServiziCliente(int idCliente, String dataIniz, String dataFine) throws Exception {
			String metodo = "listaServiziCliente(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			
			  List ret = null;
			  String sql = "call listaServiziCliente(?,?,?)";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idCliente+", ? = "+dataIniz+", ? = "+dataFine);
			  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] { idCliente, dataIniz, dataFine}, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
			return (ArrayList<ServizioType>)ret;
		}
	  
	  
	  public ArrayList<ServizioType> listaServiziSorgente(int idSorgente, String dataIniz, String dataFine) throws Exception {
				String metodo = "listaServiziSorgente(...) - ";
				logger.warn(metodo+"Inizio");
				 if (!Utils.isValidDate(dataIniz))
					 dataIniz = Costanti.DATA_INIZ;
				 if (!Utils.isValidDate(dataFine))
					 dataFine = Costanti.DATA_FINE;
				
				  List ret = null;
				  String sql = "call listaServiziSorgente(?,?,?)";
			  try{ 
				  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idSorgente+", ? = "+dataIniz+", ? = "+dataFine);
				  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] { idSorgente, dataIniz, dataFine}, new ServizioRowMapper());
				  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
			  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
			  	throw e;
			  }
			  
			  logger.warn(metodo+" Fine");
			  
				return (ArrayList<ServizioType>)ret;
			}
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
	  
		@Transactional(
			    propagation = Propagation.REQUIRED,
			    isolation = Isolation.DEFAULT,
			    readOnly = false)
	  
		public int modificaServizio(ServizioType s) throws Exception {
			String metodo = "modificaServizio(...) - ";
			logger.warn(metodo+"Inizio, ID serv user= "+s.getIdServUser());
		  Number ret = 0;
		  try{ 
			  
			  
			  String sql ="UPDATE serv_tab s SET " +
//					  			"s.id_serv_user = ?," +
//						  		"s.id_user_inse = ?," +
						  		"s.id_area = ?," +
			                     "s.id_cliente = ?," +
			                     "s.id_sorgente = ?," +
			                     "s.id_autista = ?," +
			                     "s.deco_tipo_serv = ?," +
			                     "s.citta = ?," +
			                     "s.pick_up = ?," +
			                     "s.drop_off = ?," +
			                     "s.dataora = ?," +
			                     "s.veicolo = ? ," +
			                     "s.pax = ?," +
			                     "s.prezzo = ?," +
			                     "s.is_ok = ?," +
			                     "s.note = ?," +
			                     "s.pick_tk = ?," +
			                     "s.drop_tk = ?," +
			                     "s.id_user_exec = ?," +
			                     "s.dare = ? ," +
			                     "s.avere = ?," +
			                     "s.data_fine = ?," +
			                     "s.commissione = ?," +			                     
			                     "s.ora_fine = ?," +
			                     "s.volo = ? " +
			                     "where s.id_serv_user = ? " +
			                     "and s.id_user_inse = ? "
			                     ;
			  
			  
			 
			Object[] args = new Object[]{/*s.getIdServUser(), s.getIdUserInse(),*/s.getArea().getIdArea(),s.getCliente().getIdCliente(),s.getSorgente().getIdSorgente(),
					s.getAutista().getIdAutista(),s.getTipoServizio(),s.getCitta(),s.getPickUp(),s.getDropOff(),s.getDataora(),s.getVeicolo(),
					s.getPax(),s.getPrezzo(),s.isOk()?1:0,s.getNote(),s.getPickUpToken(),s.getDropOffToken(),s.getIdUserExec(),s.getDare(),s.getAvere(),
							s.getDataFine(), s.getCommissione(),s.getOraFine(),s.getVolo(), s.getIdServUser(),s.getIdUserInse()};
			
			
			ret = getJdbcTemplate().update(sql, args);
//			areaService.modificaAutista(s.getAutista());
//			areaService.modificaSorgente(s.getSorgente());
//			
//	
			
//			sql = UPDATE autista_tab set ()
			
			logger.warn(metodo+" Esito: OK, servizio MODIFICATI "+ret+" RECORD");
		  	
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata: call modificaServizio ");
	  		logger.warn(metodo+" Attenzione: servizio NON MODIFICATO");
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
		  return ret.intValue();
		}

	  
	  @Transactional
	  public int eliminaServizio(ServizioType s) throws Exception {
		String metodo = "eliminaServizio(...) - ";
		logger.warn(metodo+"Inizio");
	  String sql = null;
	  int ret = 0;
	  try{ 
		  sql = "delete from serv_tab where id_serv_user = ? and id_user_inse = ?";
		  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+s.getIdServ());
		  	ret = getJdbcTemplate().update(sql, new Object[] { s.getIdServUser(), s.getIdUserInse()});
		  	logger.warn(metodo+" Esito: OK, servizio eliminato = "+ret);
		
	  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
	 }
		  
		  logger.warn(metodo+" Fine");
		  return ret;
		
	 }
	  
	  @Transactional(propagation = Propagation.REQUIRED,
			    isolation = Isolation.DEFAULT,
			    readOnly = false)
	  public int eliminaServizio(int idServ, int idUser) throws Exception {
		String metodo = "eliminaServizio(...) - ";
		logger.warn(metodo+"Inizio");
	  String sql = null;
	  int ret = 0;
	  try{ 
		  sql = "delete from serv_tab where id_serv = ? and id_user_inse = ?";
		  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idServ);
		  	ret = getJdbcTemplate().update(sql, new Object[] { idServ, idUser});
		  	logger.warn(metodo+" Esito: OK, servizio eliminato = "+ret);
		
	  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
	 }
		  
		  logger.warn(metodo+" Fine");
		  return ret;
		
	 }

	@Transactional(  propagation = Propagation.REQUIRED,
			    isolation = Isolation.DEFAULT,
			    readOnly = false)
	  public int inserisciServizio(ServizioType s) throws Exception {
			String metodo = "inserisciServizio(...) - ";
			logger.warn(metodo+"Inizio");
		  Number idServ = 0;
		  try{ 
			  
			  int idCliente = clienteService.inserisciClienteInt(s.getCliente());
			  s.getCliente().setIdCliente(idCliente);
			  // IMPOSTO ID_SERV_USER
			  int idServUser = 1;
			  if (s.getArea().getIdArea() != 1)  {
				  String sql = "select max(id_serv_user)+1 from serv_tab where id_user_inse = ?";
				  idServUser = getJdbcTemplate().queryForInt(sql, new Object[] {s.getIdUserInse()});  
				  
				  if (idServUser == 0) {
					  idServUser = 1; //NEL CASO DI PRIMO INSERIMENTO 
				  }
				  
				  s.setIdServUser(idServUser);
			  }

			NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
				KeyHolder keyHolder = new GeneratedKeyHolder();
				this.getJdbcTemplate().update(new PSC(s),keyHolder);
	
	

				idServ = keyHolder .getKey().longValue();


		  	if (idServ.intValue() > 0) {
		  		logger.warn(metodo+" Esito: OK, servizio INSERITO, idServ = "+idServ.intValue());
		  	} else {
		  		logger.warn(metodo+" Attenzione: servizio NON INSERITO");
		  		idServ = 0;
		  	}
		  	
		  } catch (Exception e) {
//		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
		return idServ.intValue();
		  
		}
	  
	  
	  
	  
	  
	  private int getLastIdServUser(int idUserInse) {
			String metodo = "getLastIdServUser(...) - ";
			logger.warn(metodo+"Inizio");
		  String sql = "SELECT max(id_serv_user) from serv_view s where s.id_user_inse = ?"; 
		  int ret = 0;
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUserInse);
			  	ret = getJdbcTemplate().queryForInt(sql, new Object[] { idUserInse});
			  	logger.warn(metodo+" Esito: OK, id estratto "+ret);
			
		  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
		 }
			  
			  logger.warn(metodo+" Fine");
 			return ret;
		}

	public ServizioType dettaglioServizioIdServUser(int idServUser, int idUser) throws Exception {
			String metodo = "dettaglioServizio(...) - ";
			logger.warn(metodo+"Inizio");
		  String sql = "SELECT * from serv_view s where s.id_serv_user = ? and s.id_user_inse = ?"; 
		  ServizioJson ret = null;
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idServUser);
			  	ret = (ServizioJson) getJdbcTemplate().queryForObject(sql, new Object[] { idServUser, idUser }, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, servizio estratto "+(Utils.isValid(ret.getData()) ? ret.getData().toString() : "DATA NON ESTRATTA"));
			
		  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
			  	throw e;
		 }
			  
			  logger.warn(metodo+" Fine");
   			return ret;
	  }
	  
	  public ServizioType dettaglioServizioIdServ(int idServ, int idUser) throws Exception {
			String metodo = "dettaglioServizio(...) - ";
			logger.warn(metodo+"Inizio");
		  String sql = "SELECT * from serv_view s where s.id_serv = ?"; 
		  ServizioType ret = null;
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idServ);
			  	ret = (ServizioType) getJdbcTemplate().queryForObject(sql, new Object[] { idServ }, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, servizio estratto "+(Utils.isValid(ret.getData()) ? ret.getData().toString() : "DATA NON ESTRATTA"));
			
		  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
			  	throw e;
		 }
			  
			  logger.warn(metodo+" Fine");
   			return ret;
	  }
//	  
//	  public ServizioJson dettaglioServizioJson(int idServUser, int idUser) throws Exception {
//			String metodo = "dettaglioServizio(...) - ";
//			logger.warn(metodo+"Inizio");
//		  String sql = "SELECT * from serv_view s where s.id_serv_user = ? and s.id_user_inse = ?"; 
//		  ServizioType ret = null;
//		  try{ 
//			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idServUser);
//			  	ret = (ServizioJson) getJdbcTemplate().queryForObject(sql, new Object[] { idServUser, idUser }, new ServizioRowMapper());
//			  	logger.warn(metodo+" Esito: OK, servizio estratto "+(Utils.isValid(ret.getData()) ? ret.getData().toString() : "DATA NON ESTRATTA"));
//			
//		  } catch (Exception e) {
//			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
//			  	logger.error(e);
//			  	throw e;
//		 }
//			  
//			  logger.warn(metodo+" Fine");
//   			return ret;
//	  }
	  
	  
	  
	  
	  
	  public ArrayList<ServizioType> listaServiziPrivatiInScadenza() throws Exception {
				String metodo = "listaServiziPrivatiInScadenza(...) - ";
				logger.warn(metodo+"Inizio");
			  ArrayList<ServizioType> ret = null;
			  String sql = "call listaServiziPrivatiInScadenza()";
			  try{ 
			  	
			  	logger.warn(metodo+" - Chiamata SQL = "+sql);
			  	ret =  (ArrayList<ServizioType>) getJdbcTemplate().query(sql, new Object[]{}, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, grandezza lista"+ret.size());
			  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata "+sql);
			  	logger.error(e);
			  }
			  
			  logger.warn(metodo+" Fine");
			  
		  	return ret;
		}
	  
	  
		public ArrayList<CronBean> dettaglioUserPartPerServ(int idServ) throws Exception {
			String metodo = "dettaglioUserPartPerServ(...)";
			logger.warn(metodo+"Inizio");
		  ArrayList<CronBean> ret = null;
		  String sql = "call dettaglioUserPartPerServ()";
		  try{ 
		  	
		  	logger.warn(metodo+" - Chiamata SQL = "+sql);
		  	ret =  (ArrayList<CronBean>) getJdbcTemplate().query(sql, new Object[]{idServ}, new CronRowMapper());
		  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata "+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
	  	return ret;
	}
		
		
	

	  
	  @Transactional 
		public void annullaServizio(int idServ) throws Exception {
			String metodo = "annullaServizio(...) - ";
			logger.warn(metodo+"Inizio");
			String sql = "UPDATE serv_tab SET id_user_exec = -1 WHERE id_serv = ?";
			
		  try{ 
			  int esito = 0;
			  
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" idServ ="+idServ);
			  	esito = getJdbcTemplate().update(sql, new Object[] {idServ});
			  	if (esito > 1) {
			  		logger.warn(metodo+" Esito: OK, servizio ANNULLATO");
			  	} else {
			  		logger.warn(metodo+" Esito: OK, servizio *NON* ANNULLATO");
			  	}

			  }
			  catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
			  	throw e;
			  }
			  
			  logger.warn(metodo+" Fine");
		}

	  

		
		
	private Map getServizioEditParams(ServizioType s) throws ParseException {
		String metodo = "getServizioEditParams(...) - ";
		logger.warn(metodo+"Inizio");
		Map<String, Object> ret = new HashMap<String, Object>();
	
		ret.put("id_serv", s.getIdServ());
  	ret.put("id_cliente", s.getCliente().getIdCliente());
  	ret.put("tipo_serv", s.getTipoServizio());
  	ret.put("citta", s.getCitta().toUpperCase());
  	ret.put("pick_up", s.getPickUp().toUpperCase());
  	ret.put("drop_off", s.getDropOff().toUpperCase());
  	ret.put("data_serv", s.getData()+" "+s.getOre()+":"+s.getMinuti());
  	ret.put("veicolo", s.getVeicolo().toUpperCase());
  	ret.put("pax", s.getPax());
  	ret.put("prezzo", s.getPrezzo());
  	ret.put("pick_tk", ((s.getPickUpToken() != null) ? s.getPickUpToken().toUpperCase():""));
  	ret.put("drop_tk", ((s.getDropOffToken() != null) ? s.getDropOffToken().toUpperCase():""));
  	ret.put("nome_cliente", s.getCliente().getDescNome().toUpperCase());
  	ret.put("tel_cliente", s.getCliente().getTelefono().toUpperCase());
  	ret.put("note", ((s.getNote() != null) ? s.getNote().toUpperCase(): ""));

  	logger.warn(ret);
	  	return ret;
		}
	
	/**
	 * Restituisce la differenza tra l'orario del servizio e sysdate (DATAORA - SYSDATE)
	 * @param     idServizio
	 * @return    int minuti di differenza
	 */
	public int getServizioDataoraMenoSysdate(int idServ) throws Exception {
		String metodo = "getServizioDataoraMenoSysdate(...) - ";
		logger.warn(metodo+"Inizio");
		Number minuti = 0;
		String sql = "call getServizioDataoraMenoSysdate(?)";
	  try{ 
	  	
	  	
	  	SimpleJdbcCall caller = new SimpleJdbcCall(getJdbcTemplate())
	  	.withFunctionName("getServizioDataoraMenoSysdate");
	  	
	  	Map<String, Object> p = new HashMap<String, Object>();
	  	p.put("idServ", idServ);
	  	
	  	minuti = caller.executeFunction(Number.class, p);

	  		logger.warn(metodo+" Minuti mancanti all'esecuzione del servizio: "+minuti);
	  	
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
		if (minuti == null) 
			minuti = 0;
	  return minuti.intValue();
	}

	public boolean passaServizioInAreaPubblica(int  idServ) throws Exception {
		String metodo = "passaServizioInAreaPubblica(...)";
		logger.warn(metodo+" - Inizio");
	  int esito = 0;
	  String sql = "UPDATE serv_tab SET id_area = 1 WHERE id_serv = ?";
	  try{ 
	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" idServ ="+idServ);
	  	esito = getJdbcTemplate().update(sql, new Object[] {idServ});
	  	if (esito > 1) {
	  		logger.warn(metodo+" Esito: OK, servizio passato all'AREA PUBBLICA");
	  	}

	  }
	  catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return ((esito > 0)? true : false );
		
	}

	// Questo metodo imposta il servizio come KO, quindi per qualche problema non e' riuscito a terminare tutto l'iter
	public void setServizioKO(int idServ) throws Exception {
		String metodo = "setServizioKO(...)";
		logger.warn(metodo+" - Inizio");
	  int esito = 0;
	  String sql = "UPDATE serv_tab SET is_ok = 0 WHERE id_serv = ?";
	  try{ 
	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" idServ ="+idServ);
	  	esito = getJdbcTemplate().update(sql, new Object[] {idServ});
	  	if (esito > 1) {
	  		logger.warn(metodo+" Esito: OK, servizio reso KO");
	  	}

	  }
	  catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	  
	}

	@Transactional
	public int assegnaCorsa(int idServ, int idUser) throws Exception {

			String metodo = "assegnaCorsa(...) - ";
			logger.warn(metodo+"Inizio");
		  Number check = 0;
		  try{ 
			  
			  	SimpleJdbcCall caller = new SimpleJdbcCall(getJdbcTemplate())
			  	.withProcedureName("assegnaCorsa");
					Map<String, Object> ret = new HashMap<String, Object>();
					ret.put("idServ", idServ);
					ret.put("idUser", idUser);				
					caller.execute(ret);
			
				  	logger.warn(metodo+" - Chiamata SQL = "+metodo+"   ? = "+idServ+", ? = "+idUser);
				  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
			  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+metodo);
			  	logger.error(e);
			  	throw e;
			  }
		  	

//		  	if (check.intValue() > 0) {
//		  		logger.warn(metodo+" Esito: OK, coda CORSA ASSEGNATA CORRETTAMENTE");
//		  	} else {
//		  		logger.warn(metodo+" Attenzione: CORSA NON ASSEGNATA");
//		  	}
		  	
		  
		  logger.warn(metodo+" Fine");
		  
		  return check.intValue();
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	  public ArrayList<ServizioType> listaServiziPubblici(String dataIniz, String dataFine) throws Exception {
			String metodo = "listaServiziPubblici(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			 
			 
			
			  List ret = null;
			  String sql = "SELECT *  FROM serv_pub s  where s.id_user_exec = ?  and s.dataora > now() and s.data_fine is ?";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+"   ? = "+dataIniz+", ? = "+dataFine);
			  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] {0, null}, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
			return (ArrayList<ServizioType>)ret;
		}
		
	


	  public ArrayList<ServizioType> listaServiziPubbliciIN(int idUser, String dataIniz, String dataFine) throws Exception {
			String metodo = "listaServiziPubblici(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			 
			 
			
			 ArrayList<ServizioType> ret = null;
			  String sql = "call listaServiziPubbliciIN(?,?,?)";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+"   ? = "+dataIniz+", ? = "+dataFine);
			  	ret = (ArrayList<ServizioType>) getJdbcTemplate().query(sql, new Object[] {idUser, dataIniz, dataFine}, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
			  	
//			  	if (ret.size() > 0) {
//			  		logger.warn(metodo+" Imposto la presenza di code per ogni servizio  ");
//			  		for (ServizioType s : ret) {
//			  			s.set
//			  			
//			  		}
//			  	}
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
			return (ArrayList<ServizioType>)ret;
		}
	  
	  public ArrayList<ServizioType> listaServiziPubbliciOUT(int idUser, String dataIniz, String dataFine) throws Exception {
			String metodo = "listaServiziPubblici(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			 
			 
			
			  List ret = null;
			  String sql = "call listaServiziPubbliciOUT(?,?,?)";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+"   ? = "+dataIniz+", ? = "+dataFine);
			  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] {idUser, dataIniz, dataFine}, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
			return (ArrayList<ServizioType>)ret;
		}  

	  public ServizioType dettaglioServizioPubblico(int idServ) throws Exception {
			String metodo = "dettaglioServizioPubblico(...) - ";
			logger.warn(metodo+"Inizio");
			String sql = "";
		  ServizioType ret = null;
		  SimpleJdbcCall caller = null;
		  try{ 
			  sql = "SELECT * FROM serv_pub s where s.id_serv = ?";
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idServ);
			  	ret = (ServizioType) getJdbcTemplate().queryForObject(sql, new Object[] { idServ}, new ServizioRowMapper());
			  	logger.warn(metodo+" Esito: OK, servizio estratto "+ret.getData().toString());
			
		  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
			  	throw e;
		 }
			  
			  logger.warn(metodo+" Fine");
 			return ret;
	  }
	  
	    
	  public ArrayList<ServizioType> listaServiziIdUser(int idUser, String dataIniz, String dataFine) throws Exception {
			String metodo = "listaServiziIdUser(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			
			 Timestamp i = Utils.dataStringTimestamp(dataIniz+" 00:00", Costanti.DATA_ORA_PATTERN);
			 Timestamp k = Utils.dataStringTimestamp(dataFine+" 23:59", Costanti.DATA_ORA_PATTERN);

			  List ret = null;
			  String sql = "SELECT * FROM serv_view s where s.id_user_inse = ?  AND s.dataora BETWEEN ? and ?";

		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser+", ? = "+dataIniz+", ? = "+dataFine);
//			  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] { idUser, dataIniz, dataFine}, new ServizioRowMapper());
			  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] { idUser, i, k}, new ServizioRowMapper());

			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
			return (ArrayList<ServizioType>)ret;
		
	  }
	  
	  
	    
	    public HashMap listaServiziPubJTable(String dataIniz, String dataFine, JTableType j) throws Exception {
			String metodo = "listaServiziPubJTable(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			  List ret = null;
			  String sql = "";
			  	HashMap jOut = null;
				try{ 	
						 Timestamp i = Utils.dataStringTimestamp(dataIniz+" 00:00", Costanti.DATA_ORA_PATTERN);
						 Timestamp k = Utils.dataStringTimestamp(dataFine+" 23:59", Costanti.DATA_ORA_PATTERN);
						 Object[] args = null;
						  
						  if (Utils.isValid(j.getJtSorting())) { // AJAX CON SORTING & PAGING
							  
							  sql = "SELECT *  FROM serv_pub s  where s.id_user_exec = ?  and s.dataora > now() and data_fine = ?  ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";
							  logger.warn("Select con SORTING & PAGING jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
						  } else {										// AJAX SOLO PAGING
							  sql = "SELECT *  FROM serv_pub s  where s.id_user_exec = ?  and s.dataora > now() and data_fine = ?  LIMIT ?,?";
							  logger.warn("Select con SOLO con PAGING -- jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
						  }
						  
						  	
						  	logger.warn(metodo+" - Chiamata SQL = "+sql+" , ? = "+dataIniz+", ? = "+dataFine);
							args = new Object[] {0,null, j.getJtStartIndex(),j.getJtPageSize() };
						  	ret = (List<ServizioJson>) getJdbcTemplate().query(sql, args , new ServizioRowMapper());
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
						  	
						  	int totRows = 0;
						  	if (ret.size() > 0) {
								logger.warn("PRENDO IL TOTALE PER JTABLE");
							  	sql = "SELECT count(*) FROM serv_pub s where s.dataora > now() ";
								totRows =  getJdbcTemplate().queryForInt(sql, args = new Object[] { i, k } );
						  	}
						  	
						  	
						  	
						  	jOut = new HashMap<String, Object>();
							jOut.put("Result", "OK");
							jOut.put("Records", ret);
							jOut.put("TotalRecordCount", totRows);
			
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
				  } catch (Exception e) {
				  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
				  	logger.error(e);
				  	throw e;
				  }
		  
		    logger.warn(metodo+" Fine");
			return jOut;
		}
	    
	    
	    public HashMap listaServiziPubJTableIN(int idUser, String dataIniz, String dataFine, JTableType j) throws Exception {
			String metodo = "listaServiziIdUser(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			  List ret = null;
			  String sql = "";
			  	HashMap jOut = null;
				try{ 	
						 Timestamp i = Utils.dataStringTimestamp(dataIniz+" 00:00", Costanti.DATA_ORA_PATTERN);
						 Timestamp k = Utils.dataStringTimestamp(dataFine+" 23:59", Costanti.DATA_ORA_PATTERN);
						 Object[] args = null;
						  
						  if (Utils.isValid(j.getJtSorting())) { // AJAX CON SORTING & PAGING
							  sql="SELECT * from coda_tab JOIN serv_pub s on coda_tab.id_serv = s.id_serv where coda_tab.id_user = ?" +
							  		" and s.dataora BETWEEN ? and ? ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";
							  logger.warn("Select con SORTING & PAGING  jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
						  } else {										// AJAX SOLO PAGING
							  sql="SELECT * from coda_tab JOIN serv_pub s on coda_tab.id_serv = s.id_serv where coda_tab.id_user = ?" +
								  		" and s.dataora BETWEEN ? and ? LIMIT ?,?";
							  logger.warn("Select con SOLO con PAGING -- jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
						  }
						  
						  	args = new Object[] {idUser, i, k, j.getJtStartIndex(),j.getJtPageSize() };
						  	logger.warn(metodo+" - Chiamata SQL = "+sql+" , ? = "+dataIniz+", ? = "+dataFine);
						  	ret = (List<ServizioJson>) getJdbcTemplate().query(sql, args , new ServizioRowMapper());
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
						  	
						  	int totRows = 0;
						  	if (ret.size() > 0) {
								logger.warn("PRENDO IL TOTALE PER JTABLE");
								  sql="SELECT count(*) from coda_tab JOIN serv_pub s on coda_tab.id_serv = s.id_serv where coda_tab.id_user = ?" +
									  		" and s.dataora BETWEEN ? and ? ";
								totRows =  getJdbcTemplate().queryForInt(sql, args = new Object[] {idUser, i, k } );
						  	}
						  	
						  	
						  	
						  	jOut = new HashMap<String, Object>();
							jOut.put("Result", "OK");
							jOut.put("Records", ret);
							jOut.put("TotalRecordCount", totRows);
			
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
				  } catch (Exception e) {
				  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
				  	logger.error(e);
				  	throw e;
				  }
		  
		    logger.warn(metodo+" Fine");
			return jOut;
		}
	    
	    
	    
	    public HashMap listaServiziPubJTableOUT(int idUser, String dataIniz, String dataFine, JTableType j) throws Exception {
			String metodo = "listaServiziIdUser(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			  List ret = null;
			  String sql = "";
			  	HashMap jOut = null;
				try{ 	
						 Timestamp i = Utils.dataStringTimestamp(dataIniz+" 00:00", Costanti.DATA_ORA_PATTERN);
						 Timestamp k = Utils.dataStringTimestamp(dataFine+" 23:59", Costanti.DATA_ORA_PATTERN);
						 Object[] args = null;
						 					  
						  if (Utils.isValid(j.getJtSorting())) { // AJAX CON SORTING & PAGING
							  sql = "SELECT * from serv_pub s where s.id_user_inse = ? and s.dataora BETWEEN ? and ? " +
							  		" ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";
							  logger.warn("Select con SORTING & PAGING  jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
						  } else {										// AJAX SOLO PAGING
							  sql = "SELECT * from serv_pub s where s.id_user_inse = ? and s.dataora BETWEEN ? and ? " +
							  		"LIMIT ?,?";
							  logger.warn("Select con SOLO con PAGING -- jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
						  }
						  
						  	args = new Object[] {idUser, i, k, j.getJtStartIndex(),j.getJtPageSize() };
						  	logger.warn(metodo+" - Chiamata SQL = "+sql+" , ? = "+dataIniz+", ? = "+dataFine);
						  	ret = (List<ServizioJson>) getJdbcTemplate().query(sql, args , new ServizioRowMapper());
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
						  	
						  	int totRows = 0;
						  	if (ret.size() > 0) {
								logger.warn("PRENDO IL TOTALE PER JTABLE");
								sql = "SELECT count(*) from serv_pub s where s.id_user_inse = ? and s.dataora BETWEEN ? and ?";
								totRows =  getJdbcTemplate().queryForInt(sql, args = new Object[] {idUser, i, k } );
						  	}
						  	
						  	
						  	
						  	jOut = new HashMap<String, Object>();
							jOut.put("Result", "OK");
							jOut.put("Records", ret);
							jOut.put("TotalRecordCount", totRows);
			
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
				  } catch (Exception e) {
				  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
				  	logger.error(e);
				  	throw e;
				  }
		  
		    logger.warn(metodo+" Fine");
			return jOut;
		}
	    
	    
	    
	    
	    
	    
	    
	    
	    
	    
	    
	  public HashMap listaServiziIdUserJTable(int idUser, String dataIniz, String dataFine, JTableType j) throws Exception {
			String metodo = "listaServiziIdUser(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
			  List ret = null;
			  String sql = "";
			  	HashMap jOut = null;
				try{ 	
						 Timestamp i = Utils.dataStringTimestamp(dataIniz+" 00:00", Costanti.DATA_ORA_PATTERN);
						 Timestamp k = Utils.dataStringTimestamp(dataFine+" 23:59", Costanti.DATA_ORA_PATTERN);
						 Object[] args = null;
						  
						  if (Utils.isValid(j.getJtSorting())) { // AJAX CON SORTING & PAGING
							  sql = "SELECT * FROM serv_view s where s.id_user_inse = ?  AND s.dataora BETWEEN ? and ? ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";
							  logger.warn("Select con SORTING & PAGING");
//							  String orderBy = decodeColumn(j.getJtSorting());
//							  args = new Object[] { idUser, i, k, "s."+orderBy, j.getJtStartIndex(),j.getJtPageSize() };
							  args = new Object[] { idUser, i, k, j.getJtStartIndex(),j.getJtPageSize() };
							  
							  
						  } else {										// AJAX SOLO PAGING
							  sql = "SELECT * FROM serv_view s where s.id_user_inse = ?  AND s.dataora BETWEEN ? and ? LIMIT ?,?";
							  logger.warn("Select con SOLO con PAGING -- jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
							  args = new Object[] { idUser, i, k, j.getJtStartIndex(),j.getJtPageSize() };
						  }
						  
					  
						  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser+", ? = "+dataIniz+", ? = "+dataFine);
						  	ret = (List<ServizioJson>) getJdbcTemplate().query(sql, args , new ServizioRowMapper());
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
						  	
						  	int totRows = 0;
						  	if (ret.size() > 0) {
								logger.warn("PRENDO IL TOTALE PER JTABLE");
							  	sql = "SELECT count(*) FROM serv_view s where s.id_user_inse = ? AND s.dataora BETWEEN ? and ? ";
								totRows =  getJdbcTemplate().queryForInt(sql, args = new Object[] { idUser, i, k } );
						  	}
						  	
						  	
						  	
						  	jOut = new HashMap<String, Object>();
							jOut.put("Result", "OK");
							jOut.put("Records", ret);
							jOut.put("TotalRecordCount", totRows);
			
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
				  } catch (Exception e) {
				  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
				  	logger.error(e);
				  	throw e;
				  }
		  
		    logger.warn(metodo+" Fine");
			return jOut;
		}

 
		private String decodeColumn(String j) {
			String ret = "";
			
			if (j.startsWith("idServUser")) {
				ret = "id_serv_user";
			}
			
			else if (j.startsWith("dataora"))
				ret = "dataora";
			
			else if (j.startsWith("volo"))
				ret = "volo";
			
			else if (j.startsWith("pickUp"))
				ret = "pick_up";
			
			else if (j.startsWith("dropOff"))
				ret = "drop_off";
			
			else if (j.startsWith("dataJson"))
				ret = "dataora";
			
			else if (j.startsWith("prezzo"))
				ret = "prezzo";
			
			else if (j.startsWith("dare"))
				ret = "dare";
			
			else if (j.startsWith("avere"))
				ret = "avere";
			
			else if (j.startsWith("nomeAutista"))
				ret = "nome_autista";
			else if (j.startsWith("cliente.descNome"))
				ret = "nome_cliente";
			
			
			String[] ascDesc = j.split("\\s+");
			
			ret = ret+" "+ascDesc[1];
			if (j.startsWith("inout") && ascDesc[1].equals("ASC") ) {
				ret = "s.id_sorgente";
			} if (j.startsWith("inout") && ascDesc[1].equals("DESC") ) {
				ret = "s.id_autista";
			}
			
			return ret;
		}

		
		
		public HashMap listaServiziAutistaJtable(int idAutista, int idUser,	JTableType j, String dataIniz, String dataFine) throws Exception {
				String metodo = "listaServiziAutistaJtable(...) - ";
				logger.warn(metodo+"Inizio");
				 if (!Utils.isValidDate(dataIniz))
					 dataIniz = Costanti.DATA_INIZ;
				 if (!Utils.isValidDate(dataFine))
					 dataFine = Costanti.DATA_FINE;
					List ret = null;
					String sql = "";
				  	HashMap jOut = null;
							try{ 	
									 Timestamp i = Utils.dataStringTimestamp(dataIniz+" 00:00", Costanti.DATA_ORA_PATTERN);
									 Timestamp k = Utils.dataStringTimestamp(dataFine+" 23:59", Costanti.DATA_ORA_PATTERN);
									 Object[] args = null;
									  
									  if (Utils.isValid(j.getJtSorting())) { // AJAX CON SORTING & PAGING
//										  sql = "SELECT * FROM serv_view s where s.id_user_inse and = ?  AND (id_sorgente = ? OR id_autista = ?) AND s.dataora BETWEEN ? and ? ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";
										  sql = "SELECT * FROM serv_view s where s.id_user_inse = ? AND (id_sorgente = ? OR id_autista = ?) AND s.dataora BETWEEN ? and ? ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";

										  logger.warn("Select con SORTING & PAGING");
										  args = new Object[] { idUser, idAutista, idAutista,i, k, j.getJtStartIndex(),j.getJtPageSize() };
									  } else {										// AJAX SOLO PAGING
										  sql = "SELECT * FROM serv_view s where s.id_user_inse = ?  AND (id_sorgente = ? OR id_autista = ?) AND s.dataora BETWEEN ? and ? LIMIT ?,?";
										  logger.warn("Select con SOLO con PAGING -- jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
										  args = new Object[] { idUser, idAutista, idAutista, i, k, j.getJtStartIndex(),j.getJtPageSize() };
									  }
									  
								  
									  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser+", ? = "+dataIniz+", ? = "+dataFine);
									  	ret = (List<ServizioJson>) getJdbcTemplate().query(sql, args , new ServizioRowMapper());
									  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
									  	
									  	int totRows = 0;
									  	if (ret.size() > 0) {
											logger.warn("PRENDO IL TOTALE PER JTABLE");
										  	sql = "SELECT count(*) FROM serv_view s where s.id_user_inse = ? AND (id_sorgente = ? OR id_autista = ?) AND s.dataora BETWEEN ? and ? ";
											totRows =  getJdbcTemplate().queryForInt(sql, args = new Object[] { idUser, idAutista, idAutista, i, k } );
									  	}
									  	
									  	
									  	
									  	jOut = new HashMap<String, Object>();
										jOut.put("Result", "OK");
										jOut.put("Records", ret);
										jOut.put("TotalRecordCount", totRows);	
						
									  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
							  } catch (Exception e) {
							  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
							  	logger.error(e);
							  	throw e;
							  }
					  
					    logger.warn(metodo+" Fine");
						return jOut;
					}
		  
	  
		
		public HashMap listaServiziClientiJtable(int idCliente, int idUser,	JTableType j, String dataIniz, String dataFine) throws Exception {
			String metodo = "listaServiziClientiJtable(...) - ";
			logger.warn(metodo+"Inizio");
			 if (!Utils.isValidDate(dataIniz))
				 dataIniz = Costanti.DATA_INIZ;
			 if (!Utils.isValidDate(dataFine))
				 dataFine = Costanti.DATA_FINE;
				List ret = null;
				String sql = "";
			  	HashMap jOut = null;
						try{ 	
								 Timestamp i = Utils.dataStringTimestamp(dataIniz+" 00:00", Costanti.DATA_ORA_PATTERN);
								 Timestamp k = Utils.dataStringTimestamp(dataFine+" 23:59", Costanti.DATA_ORA_PATTERN);
								 Object[] args = null;
								  
								  if (Utils.isValid(j.getJtSorting())) { // AJAX CON SORTING & PAGING
//									  sql = "SELECT * FROM serv_view s where s.id_user_inse and = ?  AND (id_sorgente = ? OR id_autista = ?) AND s.dataora BETWEEN ? and ? ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";
									  sql = "SELECT * FROM serv_view s where s.id_user_inse = ? AND id_cliente = ? AND s.dataora BETWEEN ? and ? ORDER BY "+decodeColumn(j.getJtSorting())+" LIMIT ?,?";

									  logger.warn("Select con SORTING & PAGING");
									  args = new Object[] { idUser, idCliente,i, k, j.getJtStartIndex(),j.getJtPageSize() };
								  } else {										// AJAX SOLO PAGING
									  sql = "SELECT * FROM serv_view s where s.id_user_inse = ?  AND id_cliente = ? AND s.dataora BETWEEN ? and ? LIMIT ?,?";
									  logger.warn("Select con SOLO con PAGING -- jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
									  args = new Object[] { idUser, idCliente, i, k, j.getJtStartIndex(),j.getJtPageSize() };
								  }
								  
							  
								  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser+", ? = "+dataIniz+", ? = "+dataFine);
								  	ret = (List<ServizioJson>) getJdbcTemplate().query(sql, args , new ServizioRowMapper());
								  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
								  	
								  	int totRows = 0;
								  	if (ret.size() > 0) {
										logger.warn("PRENDO IL TOTALE PER JTABLE");
									  	sql = "SELECT count(*) FROM serv_view s where s.id_user_inse = ? AND id_cliente = ?  AND s.dataora BETWEEN ? and ? ";
										totRows =  getJdbcTemplate().queryForInt(sql, args = new Object[] { idUser, idCliente, i, k } );
								  	}
								  	
								  	
								  	
								  	jOut = new HashMap<String, Object>();
									jOut.put("Result", "OK");
									jOut.put("Records", ret);
									jOut.put("TotalRecordCount", totRows);	
					
								  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
						  } catch (Exception e) {
						  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
						  	logger.error(e);
						  	throw e;
						  }
				  
				    logger.warn(metodo+" Fine");
					return jOut;
				}

		
		
		
		private MapSqlParameterSource getServizioParams(ServizioType s) throws ParseException {
			String metodo = "getServizioInsertParams(...) - ";
			logger.warn(metodo+"Inizio");
			MapSqlParameterSource ret = new MapSqlParameterSource();
		
		ret.addValue("id_serv", s.getIdServ());
		ret.addValue("id_user_inse", s.getIdUserInse());
		ret.addValue("id_serv_user", getLastIdServUser(s.getIdUserInse()));

	  	ret.addValue("id_area", s.getArea().getIdArea());
	  	ret.addValue("id_cliente", s.getCliente().getIdCliente());
	  	ret.addValue("id_sorgente", s.getSorgente().getIdSorgente());
	  	ret.addValue("id_autista", s.getAutista().getIdAutista());
	  	ret.addValue("deco_tipo_serv", s.getTipoServizio());
	  	ret.addValue("citta", (Utils.isValid(s.getCitta()) ? s.getCitta().toUpperCase() : null));
	  	ret.addValue("pick_up", s.getPickUp().toUpperCase());
	  	ret.addValue("drop_off", s.getDropOff().toUpperCase());
	  	
	  	if (Utils.isValid(s.getData()) && Utils.isValid(s.getOre()) && Utils.isValid(s.getMinuti())) {
		  	ret.addValue("dataora", (s.getData()+" "+s.getOre()+":"+s.getMinuti()));
	  	} else {
		  	ret.addValue("dataora", s.getData());
	  	}
	  	ret.addValue("data_inse", Utils.getSysDate());
	  	ret.addValue("veicolo", s.getVeicolo());
	  	ret.addValue("pax", s.getPax());
	  	ret.addValue("prezzo", s.getPrezzo());
	  	ret.addValue("note", ((s.getNote() != null) ? s.getNote().toUpperCase(): ""));
	  	ret.addValue("pick_tk", ((s.getPickUpToken() != null) ? s.getPickUpToken().toUpperCase():""));
	  	ret.addValue("drop_tk", ((s.getDropOffToken() != null) ? s.getDropOffToken().toUpperCase():""));
//	  	ret.put("nome_cliente", s.getCliente().getDescNome().toUpperCase());
//	  	ret.put("tel_cliente", s.getCliente().getTelefono().toUpperCase());
//	  	ret.put("email_cliente", (Utils.isValid(s.getCliente().getEmail()) ? s.getCliente().getEmail().toUpperCase() : null));
	  	ret.addValue("id_user_exec", s.getIdUserExec());
	  	ret.addValue("dare", s.getDare());
	  	ret.addValue("avere", s.getAvere());
	  	ret.addValue("data_fine", s.getDataFine());
	  	ret.addValue("commissione", s.getCommissione());
	  	ret.addValue("oraFine", s.getOraFine());
	  	ret.addValue("volo", s.getVolo());




	  	logger.warn(ret);
	  	return ret;
		}
		
		  @Transactional
		  public void assegnaCorsaPrivata(int idArea, int idServ, int idUserExec) throws Exception {
				String metodo = "assegnaCorsaPrivata(...) - ";
				logger.warn(metodo+"Inizio");

				String sql = "call assegnaCorsaPrivata(?,?,?)";
			  try{ 
			  	
			  	Number esito = 0;
			  	SimpleJdbcCall caller = new SimpleJdbcCall(getJdbcTemplate())
			  	.withFunctionName("assegnaCorsaPrivata");
			  	
			  	Map<String, Object> p = new HashMap<String, Object>(16);
			  	p.put("idArea", idArea);
			  	p.put("idServ", idServ);
			  	p.put("idUser", idUserExec);
			  	
			  	
			  	esito = caller.executeFunction(Number.class, p);

			  	if (esito.intValue() > 0) {
			  		logger.warn(metodo+" Esito: OK, servizio INSERITO, idServ = "+esito.intValue());
			  	} else {
			  		logger.warn(metodo+" Attenzione: servizio NON INSERITO");
			  	}
			  	
			  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
			  	throw e;
			  }
			  
			  logger.warn(metodo+" Fine");
			  
			}
		  
		  
		  public ArrayList<ServizioType> listaServiziPerArea(int idArea, String dataIniz, String dataFine) throws Exception {
				String metodo = "listaServiziPerArea(...) - ";
				logger.warn(metodo+"Inizio");
				 if (!Utils.isValidDate(dataIniz))
					 dataIniz = Costanti.DATA_INIZ;
				 if (!Utils.isValidDate(dataFine))
					 dataFine = Costanti.DATA_FINE;
				 
				 
				
				  List ret = null;
				  String sql = "call listaServiziPerArea(?,?,?)";
			  try{ 
				  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idArea+", ? = "+dataIniz+", ? = "+dataFine);
				  	ret = (List<ServizioType>) getJdbcTemplate().query(sql, new Object[] { idArea, dataIniz, dataFine}, new ServizioRowMapper());
				  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
			  } catch (Exception e) {
			  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
			  	logger.error(e);
			  	throw e;
			  }
			  
			  logger.warn(metodo+" Fine");
			  
				return (ArrayList<ServizioType>)ret;
			}
		  
	  
}
	

	